#include "Buffer.h"

/*
class Buffer
{
private:
    std::string buf_;       // 用于存放数据

public:
    Buffer();
    ~Buffer();

    void append(const char* data, size_t size);     //把数据追加到buf_中
    size_t size();                                  //返回buf_的大小
    const char* data();                             //返回buf_的首地址
    void clear();                                   //清空buf_
};
*/  

Buffer::Buffer(uint16_t sep):sep_(sep)
{

} 

Buffer::~Buffer()
{

}

//把数据追加到buf_
void Buffer::append(const char* data, size_t size)      //把数据追加到buf_中
{
    buf_.append(data, size);
}


//返回buf_的大小
size_t Buffer::size()
{
    return buf_.size();
}

//返回buf_的首地址
const char* Buffer::data()
{
    return buf_.data();
}

//清空buf_
void Buffer::clear()
{
    buf_.clear();
}

//从buf_的pos开始，删除size个字节
void Buffer::erase(size_t pos, size_t size)
{
    buf_.erase(pos, size);
}

void Buffer::appendWithSep(const char* data, size_t size) //把数据追加到buf_中，附加报文头部
{
    if(sep_ == 0)//无分隔符
    {
        buf_.append(data);
    }
    else if(sep_ == 1)//四字节报文
    {
        buf_.append((char*)&size, 4);   //报文头部
        buf_.append(data, size);        //处理报文内容
    }
}

bool Buffer::pickMessage(std::string &message)         //从buf_中拆分出一个报文,存放在message中，如果buf_中没有报文，返回false
{
    if(buf_.size() == 0) return false;

    if(sep_ == 0)   //无分隔符
    {
        message = buf_;
        buf_.clear();
    }
    else if(sep_ == 1)  //四字节的报文
    {
        int len;
        memcpy(&len, buf_.data(), 4);  //先获取报文长度
        //如果接收区input_buffer_的数据量小于报文头部，说明inputbuffer中的报文内容不完整
        if(buf_.size()<len+4) return false;
#if 0
        std::string tmp(buf_.data() + 4, len);//从inputbuffer中获取一个报文       
        message = tmp;
#else
        message = buf_.substr(4, len);
#endif
        buf_.erase(0, len + 4);
    }

    return true;
}